package gui.managedbeans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import Basicas.Usuario;
import BasicasEnum.SituacaoUsuario;
import BasicasEnum.TipoPermissao;
import Exception.AlterarException;
import Exception.GenericoException;
import Exception.InserirException;
import Fachada.Fachada;

@ManagedBean
@SessionScoped
public class UsuarioBean {
	
	public UsuarioBean(){	
		
		usuario = new Usuario();
		usuarios = new ArrayList<Usuario>();
		
		
	}
	
	private Usuario usuario;
	
	@ManagedProperty("#{beanLogin.usuarioLogado}")
	private Usuario usuarioLogado;
	
	@SuppressWarnings("unused")
	private List<Usuario> usuarios;

	private String senhaConfirmacao;
	
	private String novaSenha;
	
	TipoPermissao[] permissoes;
	
	SituacaoUsuario[] situacoes;
	
	
	
	
	
	

	/**
	 * Set e get
	 * @return
	 */
	
	
	public Usuario getUsuario() {
		return usuario;
	}

	public String getNovaSenha() {
		return novaSenha;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}

	public String getSenhaConfirmacao() {
		return senhaConfirmacao;
	}

	public void setSenhaConfirmacao(String senhaConfirmacao) {
		this.senhaConfirmacao = senhaConfirmacao;
	}

	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}

	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<Usuario> getUsuarios() {
		
		List<Usuario> lista = new ArrayList<Usuario>();
		for (Usuario u : Fachada.getFachada().usuarioListarTodos()) {
			if(u.getSituacaoUsuario()== SituacaoUsuario.Ativo){
				lista.add(u);
			}
		}
		return lista;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
	
	public SituacaoUsuario[] getSituacoes() {
		return SituacaoUsuario.values();
	}

	public void setSituacoes(SituacaoUsuario[] situacoes) {
		this.situacoes = situacoes;
	}

	public TipoPermissao[] getPermissoes() {
		return TipoPermissao.values();
	}

	public void setPermissoes(TipoPermissao[] permissoes) {
		this.permissoes = permissoes;
	}
	
	public void limpar(){
		
		this.usuario = new Usuario();
	}
	
	public String salvar(){
		String retorno=null;
		
		this.usuario.setResponsavel(this.usuarioLogado);		
		this.usuario.setDataModificacao(new Date());
		
		if(this.usuario.getCodigo()== null || this.usuario.getCodigo() == 0){
			try {
				this.usuario.setDataCriacao(new Date());	
				this.usuario.setCodigo(null);
				this.usuario.setSituacaoUsuario(SituacaoUsuario.Ativo);
					Fachada.getFachada().usuarioInserir(this.usuario, this.senhaConfirmacao);
				
				this.usuarios = Fachada.getFachada().usuarioListarTodos();
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"", "Usuario Cadastrado com sucesso"));
				retorno = "/usuario/usuarioList?faces-redirect=true";
				limpar();
			} catch (InserirException e) {
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_FATAL,"",e.getMessage()));
			} catch (GenericoException e) {
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_FATAL,"",e.getMessage()));
				
				e.printStackTrace();
			}
			
		}else{
			
			try {
				
					Fachada.getFachada().usuarioAlterar(this.usuario);
				
				limpar();
				retorno = "/usuario/usuarioList?faces-redirect=true";
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"","Usuario Alterado com sucesso"));
				
			} catch (AlterarException e) {
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_FATAL,"","Falha ao Alterar"));
			}catch (GenericoException e) {
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_FATAL,"","Falha ao Alterar"));
				
				e.printStackTrace();
			}
		}
		
		return retorno;
	}
	
	public String prepararEdicao(Usuario usuario){
		
		this.usuario.setResponsavel(this.usuarioLogado);		
		this.usuario.setDataModificacao(new Date());
		this.usuario = usuario;
		return "/usuario/usuarioEdit?faces-redirect=true";
	}
	public String prepararAlterarSenha(){
		
		return "/usuario/usuarioAlterarSenha?faces-redirect=true";
	}
	
	public String SenhaAlterada(){
		
		try {
			Fachada.getFachada().alterarSenhaUsuario(this.usuario, this.novaSenha, this.novaSenha);
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"","Senha Alterada com sucesso"));
			return  "/usuario/usuarioList?faces-redirect=true";
		} catch (GenericoException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,"",e.getMessage()));
			
			e.printStackTrace();
		} catch (AlterarException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,"",e.getMessage()));
			
			e.printStackTrace();
		}
		return null;
	}
	public String prepararSalvar(){
		
		limpar();
		return "/usuario/usuarioAdd?faces-redirect=true";
	}
	
	public void preExcluir(Usuario usuario){
		this.usuario = usuario;
	}
	
	public String excluir(){
		
		
		try {
			this.usuario.setResponsavel(this.usuarioLogado);		
			this.usuario.setDataModificacao(new Date());
			this.usuario.setSituacaoUsuario(SituacaoUsuario.Inativo);

				Fachada.getFachada().usuarioAlterar(this.usuario);
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"","Registro Excluido"));
				
			} catch (AlterarException e) {
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"","Registro Excluido"));
				
				e.printStackTrace();
			} catch (GenericoException e) {
				FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"","Falaha ao excluir"));
				
				e.printStackTrace();
			}
			
		return null;
		
	}
	
	


}
